package cn.jltx.support;

/**
 * @author jltxseo
 *         Created by junlintianxia on 2017/05/07.
 */

public interface ISupport {
    /**
     * 加载根Fragment, 即Activity内的第一个Fragment 或 Fragment内的第一个子Fragment
     *
     * @param containerId 容器id
     * @param toFragment  目标Fragment
     */
    void loadRootFragment(int containerId, SupportFragment toFragment);

    /**
     * 加载多个根Fragment
     * @param containerId
     * @param showPosition
     * @param toFragments
     */
    void loadMultipleRootFragment(int containerId, int showPosition, SupportFragment... toFragments);

    /**
     * 加载多个根Fragment,默认选中第0个
     * @param containerId
     * @param toFragments
     */
    void loadMultipleRootFragment(int containerId, SupportFragment... toFragments);
    /**
     * 出栈
     */
    void pop();

    /**
     * 直接以添加的方式打开一个Fragment
     * @param toFragment
     */
    void startFragment(SupportFragment toFragment);

    /**
     * 直接以添加的方式打开一个Fragment，并且关闭当前的Fragment
     * @param toFragment
     */
    void startFragmentWithPop(SupportFragment toFragment);

    void popFragmentTo(Class<?> fragmentClass, boolean includeSelf, Runnable afterPopTransactionRunnable);

    void popFragmentTo(String fragmentTag, boolean includeSelf, Runnable afterPopTransactionRunnable);


    SupportFragment getTopFragment();

    FragmentImpl getFragmentImpl();

    /**
     * @param fragmentClass 目标Fragment的Class
     * @param <T>           继承自SupportFragment的Fragment
     * @return 目标Fragment
     */
    <T extends SupportFragment> T findFragment(Class<T> fragmentClass);

    <T extends SupportFragment> T findFragment(String fragmentTag);

    /**
     * show一个Fragment,hide上一个Fragment
     * 使用该方法时，要确保同级栈内无多余的Fragment,(只有通过loadMultipleRootFragment()载入的Fragment)
     *
     * @param showFragment 需要show的Fragment
     */
    void showHideFragment(SupportFragment showFragment);

    /**
     * show一个Fragment,hide一个Fragment ; 主要用于类似微信主页那种 切换tab的情况
     *
     * @param showFragment 需要show的Fragment
     * @param hideFragment 需要hide的Fragment
     */
    void showHideFragment(SupportFragment showFragment, SupportFragment hideFragment);

    /**
     * 以replace方式加载根Fragment
     */
    void replaceLoadRootFragment(int containerId, SupportFragment toFragment, boolean addToBack);

}